﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace hse_2013_twinpics
{
    public partial class MainForm : Form
    {
        PicAnimation pa;

        private Image[] Immas; // Массив для лицевых картинок

        const int FieldSize=4;  // Размер поля для игры, просьба не менять, значение не влияет на размер формы
        
        private Elementpic[,] ElementPics;   // Массив карточек на поле

        int CountOpenPic = 0; //Количество открытых карточек на поле в текущий момент

        int[] mixindex1 = new int[16];   //массив перемешанных индексов для перемешивания ссылок на картинки

        TimeSpan span = new TimeSpan(0, 0, 2); // время задержки

        int PareCounter = 0;

        private void Pic_Click(object sender, EventArgs e) //Метод обработки клика на карточку
        {
            if (((Elementpic)sender).IsOpen==false&&CountOpenPic<=1)  //Если карточка закрыта
            {

                // http://www.cyberforum.ru/csharp-beginners/thread292570.html
                pa = new Elementpic();
                ((System.ComponentModel.ISupportInitialize)(this.pa)).BeginInit();
                pa.Image = Properties.Resources.cover;
                pa.Location = new Point(i * (Properties.Resources.p0.Size.Height) + 10 * i + 10, j * (Properties.Resources.p0.Size.Width) + 10 * j + 55);
                pa.Name = "Im" + i.ToString() + j.ToString();
                pa.Size = new Size(Properties.Resources.p0.Size.Width, Properties.Resources.p0.Size.Height);
                pa.TabIndex = 0;
                pa.TabStop = false;
                pa.Click += new EventHandler(Pic_Click);
                pa.PicIndex = mixindex1[i * FieldSize + j];
                ((System.ComponentModel.ISupportInitialize)(this.pa)).EndInit();
                this.Controls.Add(pa);


                Elementpic.Open((Elementpic)sender, Immas); //Открыть карточку
                ((Elementpic)sender).Invalidate();
                ((Elementpic)sender).Refresh();
                CountOpenPic++;    //Увеличить счетчик открытых карточек
                //MessageBox.Show(((Elementpic)sender).ToString()); // Немного магии
                if (CountOpenPic == 2) //Если 2 карточки открыты ищем пару
                {
                    Thread.Sleep(span); // задержка для пользователя
                    for (int i = 0; i < FieldSize; i++)
                        for (int j = 0; j < FieldSize; j++)
                        {
                            if ((ElementPics[i, j].IsOpen) && (ElementPics[i, j] != (Elementpic)sender))
                                if ((Elementpic.Compare(ElementPics[i, j], (Elementpic)sender))) //пара найдена, убираем ее с поля
                                {
                                    ElementPics[i, j].Visible = false;
                                    ElementPics[i, j].Enabled = false;
                                    ElementPics[i, j].IsOpen = false;
                                    ((Elementpic)sender).Visible = false;
                                    ((Elementpic)sender).Enabled = false;
                                    ((Elementpic)sender).IsOpen = false;
                                    CountOpenPic -= 2;
                                    PareCounter++;
                                }
                                else  //открытые карточки непарные, закрываем
                                {
                                    Elementpic.Close(((Elementpic)sender), Properties.Resources.cover);
                                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                                    CountOpenPic -= 2;
                                }
                        }
                }
            }
            else  //пользователь нажал на уже открытую карточку, закрываем ее
            {
                Elementpic.Close(((Elementpic)sender), Properties.Resources.cover);
                CountOpenPic--;
            }
            if (PareCounter == FieldSize * 2)
            {
                DialogResult victory = new System.Windows.Forms.DialogResult();
                victory = MessageBox.Show("Поздравляем! Вы нашли все парные картинки! Чтобы начать заново, нажмите ОК, чтобы выйти из игры - Отмена", "Это победа!", MessageBoxButtons.OKCancel, MessageBoxIcon.None);
                if (victory == DialogResult.OK)
                    Application.Restart();
                else
                    Application.Exit();
            }
        }


        public void MixImage() //Метод перемешивания картинок в массиве Immas
        {
            int[] mixindex = new int[8]; //массив перемешанных индексов для произвольного порядка картинок
            Random rand = new Random();
            int randi1, randi2, buf;

            for (int i = 0; i < 8; i++) //Заполняем массив чисоами по порядку
            {
                mixindex[i] = i;
            }
            for (int k = 0; k < 50; k++) //тасуем пары элементов массива
            {
                randi1 = rand.Next(0, 7);
                randi2 = rand.Next(0, 7);
                buf = mixindex[randi1];
                mixindex[randi1] = mixindex[randi2];
                mixindex[randi2] = buf;
            }

            Immas = new Image[FieldSize * FieldSize / 2];
            //Заполняем массив картинками
            Immas[mixindex[0]] = Properties.Resources.p0;
            Immas[mixindex[1]] = Properties.Resources.p1;
            Immas[mixindex[2]] = Properties.Resources.p2;
            Immas[mixindex[3]] = Properties.Resources.p3;
            Immas[mixindex[4]] = Properties.Resources.p4;
            Immas[mixindex[5]] = Properties.Resources.p5;
            Immas[mixindex[6]] = Properties.Resources.p6;
            Immas[mixindex[7]] = Properties.Resources.p7;

            for (int k = 0; k < 16; k++)    //заполнение массива 0,1,..,6,7,0,...,7
            {
                mixindex1[k] = k % 8;
            }
            for (int k = 0; k < 50; k++)        //перетасовка элементов массива
            {
                randi1 = rand.Next(0, 16);
                randi2 = rand.Next(0, 16);
                buf = mixindex1[randi1];
                mixindex1[randi1] = mixindex1[randi2];
                mixindex1[randi2] = buf;
            }

        }

        public void PicGen()   //Создание и вывод карточек
        {
            ElementPics = new Elementpic[FieldSize, FieldSize];
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {   // создаем очередную картинку, определяем ее свойства и добавляем на форму
                    ElementPics[i, j] = new Elementpic(i * FieldSize + j);
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).BeginInit();
                    ElementPics[i, j].Image = Properties.Resources.cover;
                    ElementPics[i, j].Location = new Point(i * (Properties.Resources.p0.Size.Height)+10*i+10, j * (Properties.Resources.p0.Size.Width) + 10*j+55);
                    ElementPics[i, j].Name = "Im" + i.ToString() + j.ToString();
                    ElementPics[i, j].Size = new Size(Properties.Resources.p0.Size.Width, Properties.Resources.p0.Size.Height);
                    ElementPics[i, j].TabIndex = 0;
                    ElementPics[i, j].TabStop = false;
                    ElementPics[i, j].Click += new EventHandler(Pic_Click);
                    ElementPics[i, j].PicIndex = mixindex1[i * FieldSize + j];
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).EndInit();
                    this.Controls.Add(ElementPics[i, j]);
                }
        }

        public void Initialwave() // показать картинки перед началом игры на время span
        {
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                    Elementpic.Open(ElementPics[i, j], Immas);
            Thread.Sleep(span);
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
        }

        public MainForm()
        {
            InitializeComponent();
            MixImage();  //смешать изображения
            PicGen();   //создать и вывести картинки
            Initialwave(); // показать целую картинку
        }

        private void новаяИграToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PareCounter = 0;
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                    ElementPics[i, j].Visible = true;
                    ElementPics[i, j].Enabled = true;
                }
            foreach (Control element in this.Controls)
            {
                if (element is Elementpic)
                {

                }
            }
            CountOpenPic = 0;
            MixImage();
            for (int i=0;i<FieldSize;i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    ElementPics[i, j].PicIndex = mixindex1[i * FieldSize + j]; 
                }
            Initialwave();
        }
    }
}
